package pe.edu.cibertec.entity;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToOne;
import javax.persistence.QueryHint;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;


@NamedQueries({
    @NamedQuery(name = "Cliente.getTodos",query = "SELECT c FROM Cliente c"),
    @NamedQuery(name = "Cliente.getClientesByCiudad",query = "SELECT c.nombre , c.apellido , c.ciudad FROM Cliente c WHERE c.ciudad = :ciudad")
})

@Entity
@Table(name = "TAB_CLIENT")
public class Cliente implements Serializable {

    @Id
    @Column(name = "IDENTIFIER")
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "tablaSecuencia")
    @TableGenerator(name = "tablaSecuencia",
            table = "TAB_SEQUENCE",
            pkColumnName = "TABLENAME",
            valueColumnName = "TABLEVALUE",
            pkColumnValue = "TAB_CLIENT",
            allocationSize = 2)
    private Integer codigo;
    @Column(name = "FIRSTNAME")
    private String nombre;
    @Column(name = "LASTNAME")
    private String apellido;
    @Temporal(TemporalType.DATE)
    @Column(name = "RECORDDATE", updatable = false)
    private Date fechaRegistro;
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "VERIFYDATE", insertable = false)
    private Date fechaVerificacion;
    @Embedded
    @AttributeOverrides({
        @AttributeOverride(name = "direccion",
                column =
                @Column(name = "ADDRESS")),
        @AttributeOverride(name = "codigoPostal",
                column =
                @Column(name = "POSTALCODE"))
    })
    private Direccion direccion;
    //RELACIONES
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "CITY", referencedColumnName = "IDENTIFIER")
    private Ciudad ciudad;
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "MEMBERSHIPCARD",
            referencedColumnName = "IDENTIFIER",
            unique = true)
    private TarjetaMembresia tarjetaMembresia;
    @ManyToMany(targetEntity = pe.edu.cibertec.entity.Preferencia.class)
    @JoinTable(name = "TAB_CLIENT_PREFERENCE",
            joinColumns =
            @JoinColumn(name = "CLIENTIDENTIFIER"),
            inverseJoinColumns =
            @JoinColumn(name = "PREFERENCEIDENTIFIER"))
    private Collection<Preferencia> preferencias;

    public Integer getCodigo() {
        return codigo;
    }

    public void setCodigo(Integer codigo) {
        this.codigo = codigo;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getApellido() {
        return apellido;
    }

    public void setApellido(String apellido) {
        this.apellido = apellido;
    }

    public Date getFechaRegistro() {
        return fechaRegistro;
    }

    public void setFechaRegistro(Date fechaRegistro) {
        this.fechaRegistro = fechaRegistro;
    }

    public Date getFechaVerificacion() {
        return fechaVerificacion;
    }

    public void setFechaVerificacion(Date fechaVerificacion) {
        this.fechaVerificacion = fechaVerificacion;
    }

    public Direccion getDireccion() {
        return direccion;
    }

    public void setDireccion(Direccion direccion) {
        this.direccion = direccion;
    }

    public Ciudad getCiudad() {
        return ciudad;
    }

    public void setCiudad(Ciudad ciudad) {
        this.ciudad = ciudad;
    }

    public TarjetaMembresia getTarjetaMembresia() {
        return tarjetaMembresia;
    }

    public void setTarjetaMembresia(TarjetaMembresia tarjetaMembresia) {
        this.tarjetaMembresia = tarjetaMembresia;
    }

    public Collection<Preferencia> getPreferencias() {
        return preferencias;
    }

    public void setPreferencias(Collection<Preferencia> preferencias) {
        this.preferencias = preferencias;
    }

    @Override
    public String toString() {
        return "Cliente{" + "codigo=" + codigo + ", nombre=" + nombre
                + ", apellido=" + apellido + ", fechaRegistro=" + fechaRegistro
                + ", fechaVerificacion=" + fechaVerificacion
                + ", direccion=" + direccion + ", ciudad=" + ciudad
                + ", tarjetaMembresia=" + tarjetaMembresia
                + ", preferencias=" + preferencias + '}';
    }
}